package org.lestr.secuel.m3ds;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Variable {


    // Déclaration de constantes
    private static final long serialVersionUID = 1L;


    // Déclaration des attributs
    private String nom;


    private Valeur valeur;


    private Collection<VariableEcouteur> écouteurs;


    // Constructeur
    public Variable() {

        // Instanciation des attributs
        valeur = null;
        écouteurs = new ArrayList<VariableEcouteur>();

    }// FIN Constructeur


    /** Ajoute un écouteur à la variable */
    public void ajoutEcouteur(VariableEcouteur écouteur) {

        écouteurs.add(écouteur);

    }// FIN ajoutEcouteur


    /** Retire un écouteur à la variable */
    public void retraitEcouteur(VariableEcouteur écouteur) {

        écouteurs.remove(écouteur);

    }// FIN retraitEcouteur


    /** Retourne les écouteur de la variable */
    public Iterator<VariableEcouteur> getEcouteurs() {

        return écouteurs.iterator();

    }// FIN getEcouteurs


    /** Défini le nom de la variable */
    public void setNom(String nom) {

        this.nom = nom;

    }// FIN setNom


    /** Retourne le nom de la variable */
    public String getNom() {

        return nom;

    }// FIN getNom


    /** Défini la valeur de la variable */
    public void setValeur(Valeur valeur) {

        // Mémorise la valeur
        this.valeur = valeur;

        // Prévient les écouteurs
        for (VariableEcouteur écouteur : écouteurs)
            écouteur.variableModifiée(this);

    }// FIN setValeur


    /** Retourne la valeur de la varaible */
    public Valeur getValeur() {

        return valeur;

    }// FIN getValeur


    public static interface VariableEcouteur extends Serializable {


        /** Une variable a changée de valeur */
        public void variableModifiée(Variable variable);


    }// FIN Interface


}// FIN Classe
